package xin.exec.executor.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.concurrent.RejectedExecutionHandler;

/**
 * <pre>
 * 线城池配置信息
 * {@link org.springframework.boot.context.properties.ConfigurationProperties}注解用于绑定属性其中prefix表示所绑定的属性的前缀
 * 可配合{@link org.springframework.context.annotation.PropertySource} 使用
 * </pre>
 * @author lixin_ma@outlook.com
 * @version 1.0
 * @since 2019/8/9
 */
@Component
@Data
@ConfigurationProperties(prefix = "executor")
public class ExecutorConfig {
	
	/**
	 * <pre>
	 * 核心线程数
	 * 核心线程会一直存活，及时没有任务需要执行
	 * 当线程数小于核心线程数时，即使有线程空闲，线程池也会优先创建新线程处理
	 * 设置allowCoreThreadTimeout=true（默认false）时，核心线程会超时关闭
	 * </pre>
	 */
	private Integer corePoolSize;
	
	/**
	 * <pre>
	 * 缓冲队列大小
	 * 当核心线程数达到最大时，新任务会放在队列中排队等待执行
	 * </pre>
	 */
	private Integer maxPoolSize;
	
	/**
	 * <pre>
	 * 最大线程数 = 最大任务数-队列容量）/每个线程每秒处理能力
	 * 当线程数>=corePoolSize，且任务队列已满时。线程池会创建新线程来处理任
	 * 当线程数=maxPoolSize，且任务队列已满时，线程池会拒绝处理任务而抛出异常
	 */
	private Integer queueCapacity;
	
	/**
	 * <pre>
	 * 前缀
	 * </pre>
	 */
	private String threadNamePrefix;
	
	/**
	 * <pre>
	 * 任务拒绝处理器
	 * 当线程数已经达到maxPoolSize，切队列已满，会拒绝新任务
	 * 当线程池被调用shutdown()后，会等待线程池里的任务执行完毕，再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务，会拒绝新任务
	 *
	 * {@link java.util.concurrent.ThreadPoolExecutor.AbortPolicy} - 丢弃任务并抛出RejectedExecutionException异常(默认)
	 * {@link java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy} - 由调用线程处理该任务
	 * {@link java.util.concurrent.ThreadPoolExecutor.DiscardPolicy} - 丢弃任务，但是不抛出异常
	 * {@link java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy} - 从队列中踢出最先进入队列（最后一个执行）的任务
	 * </pre>
	 */
	private Class<? extends RejectedExecutionHandler> rejectedExecutionHandler;
	
	/**
	 * <pre>
	 * 线程空闲时间
	 * 当线程空闲时间达到keepAliveTime时，线程会退出，直到线程数量=corePoolSize
	 * 如果allowCoreThreadTimeout=true，则会直到线程数量=0
	 * </pre>
	 */
	private Integer keepAliveSeconds;
	
	/**
	 * <pre>
	 * 等待时间 （默认为0，此时立即停止），并没等待xx秒后强制停止
	 * </pre>
	 */
	private Integer awaitTerminationSeconds;
	
	/**
	 * <pre>
	 * 等待任务在关机时完成--表明等待所有线程执行完 默认true
	 * </pre>
	 */
	private Boolean waitForTasksToCompleteOnShutdown;
	
	/**
	 * <pre>
	 * 是否允许核心线程超时
	 * </pre>
	 */
	private Boolean allowCoreThreadTimeOut;

	/**
	 * bean name
	 */
	private String beanName;
}
